package com.bird.设计模式.创建型.原型模式;

/**
 * @data 2022/3/6 16:56
 * @author: bird
 * @description: 调试原型模式
 * 业务场景:
 * 1:现在慕课网做一些视频的积分抽奖加积分的业务场景 然后需要发送邮件或者短信给到用户。然而邮件对象的创建过程是非常繁琐的过程。
 * 这样的话 就可以使用原型的模式
 */
public class Test {


    /**
     * 业务场景：循环10次发送模板短信并保存发送记录。
     * 缺点： 频繁的创建大量的邮件对象 造成内存溢出
     * 改进：使用原型模式
     */
    public static void main1(String[] args) {
        Mail mail = new Mail();
        mail.setContent("初始化模板");
        for (int i = 0; i < 10; i++) {
            mail.setName("姓名: " + i);
            mail.setEmailAddress("姓名: " + i + " @imooc.com");
            mail.setContent("恭喜您,此次慕课网活动中奖了..");
            MailUtil.sendMail(mail);
        }
        MailUtil.saveOriginMailRecord(mail);
    }


    /**
     * 使用原型模式：优化上面的频繁创建对象的问题
     * 思路是： 采用的是在内存中进行二进制的拷贝 比直接new一个性能好很多.
     * 第一步：Mail类实现 Cloneable接口
     * 第二步：重写clone()
     */

    public static void main(String[] args) throws CloneNotSupportedException {
        Mail mail = new Mail();
        mail.setContent("初始化模板");
        for (int i = 0; i < 10; i++) {
            Mail mailTemp = (Mail) mail.clone();
            mailTemp.setName("姓名: " + i);
            mailTemp.setEmailAddress("姓名: " + i + " @imooc.com");
            mail.setContent("恭喜您,此次慕课网活动中奖了..");
            MailUtil.sendMail(mailTemp);
        }
        MailUtil.saveOriginMailRecord(mail);
    }


// 原型模式 采用的是在内存中进行二进制的拷贝 比直接new一个性能好很多.


    /*
     * 知识点：
     * 1：克隆方法不会调用构造器
     * 2：原型模式 采用的是在内存中进行二进制的拷贝 比直接new一个性能好很多.
     *
     *
     *
     *
     * */
}

